﻿#Variables
$Delegate_Toolkit_WebTemplate_Hub = "IBP.HUBTEMPLATE"
$Delegate_Toolkit_WebTemplate_DocCenter = "IBP.DOCCENTERTEMPLATE"
$Delegate_Toolkit_WebTemplate_Projet = "IBP.PROJECTTEMPLATE"
$Delegate_Toolkit_WebTemplate_BiblioProduit = "IBP.PRODUCTLIBTEMPLATE"
$Delegate_Toolkit_WebTemplate_Biblio2 = "IBP.ACTSERVLIBTEMPLATE"
$Delegate_Toolkit_ListName_DocCenterIbp = "Documents i-BP"
$Delegate_Toolkit_ListName_DocCenterIbpBanques = "Documents i-BP + Banques"
$Delegate_Toolkit_ListName_DocCenterInternes = "Documents i-BP Internes"

function RunStep
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)]
		[int] $stepNumber, 
		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=1)]
		[int] $totalSteps, 
		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=2)]
		[string] $stepName, 
		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=3)]
		[ScriptBlock] $cmd
	)
	process
	{
		Write-Host "=================================================================================="
		Write-Host "Etape " $stepNumber "/" $totalSteps " : " $stepName 
		Write-Host ([System.DateTime]::Now.ToString("`tLe dd/MM/yyy à HH`\hmm"))
		Write-Host "----------------------------------------------------------------------------------"
		
		$errorMessage = $null
		try
		{
			&$cmd
		}
		catch
		{
			$errorMessage = $_
		}
		
		Write-Host "----------------------------------------------------------------------------------"
		if($errorMessage -eq $null)
		{
			Write-Host ">> OK" -ForegroundColor Green
			Write-Host ([System.DateTime]::Now.ToString("`tLe dd/MM/yyy à HH`\hmm")) -ForegroundColor Green
		}
		else
		{
			Write-Host "!! KO" -ForegroundColor Red
			Write-Host ([System.DateTime]::Now.ToString("`tLe dd/MM/yyy à HH`\hmm")) -ForegroundColor Red
			Write-Host $errorMessage -ForegroundColor Red
		}
		Write-Host "=================================================================================="
		Write-Host ; Write-Host

	}
}

function RunScriptNewShell
{
	# $command = "& `'" + $stepScriptPath + "`' `'" + $env + "`'"
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)]
		[string] $command
	)
	process
	{
		# invoke the command, i.e. the script in a separate process
		powershell.exe -command $command -WindowStyle Maximized
		
		# check for the exit code (assuming 0 is for success)
		if ($LastExitCode) {
			# in this demo just write a warning
			Write-Warning "Script $script failed."
		}
#		else {
#			Write-Host "Script $script succeeded."
#		}

	}
}

#
# Exécution d'un ensemble de traitements sur un Hub de modèle de documents
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnHub
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_Hub `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur un Hub de modèle de documents
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnHub_FromConfig
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[xml] $ConfigXmlDoc,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[int] $CoreIndex,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite_FromConfig `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_Hub `
			-ConfigXmlDoc $ConfigXmlDoc `
			-CoreIndex $CoreIndex `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur un DocCenter
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnDocCenter
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_DocCenter  `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur un DocCenter
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnDocCenter_FromConfig
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[xml] $ConfigXmlDoc,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[int] $CoreIndex,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite_FromConfig `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_DocCenter  `
			-ConfigXmlDoc $ConfigXmlDoc `
			-CoreIndex $CoreIndex `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur un DocCenter et ses listes
# REMARQUES : 
#		* Le délégué de site appelé doit prendre un paramètre de type SPSite nommé Site
#		* Le délégué de liste appelé doit prendre un paramètre de type SPList nommé -List
function RunOnDocCenterAndLists
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmdSite,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmdList
	)
	begin
	{
		$localAssignment = Start-SPAssignment
		$allSites = $localAssignment | Get-SPSite -Limit All | ?{$_.RootWeb.WebTemplate -like $Delegate_Toolkit_WebTemplate_DocCenter }
	}
	process
	{
		foreach($site in $allDocCenters)
		{
			# Execution des traitements de site
			write-host "> Site : " $site.Url -f white
			&$cmdSite -Site $site
			
			# Execution des traitements de liste
			write-host "+ Liste [ $Delegate_Toolkit_ListName_DocCenterIbp ]" -f white
			$list = $web.Lists[$Delegate_Toolkit_ListName_DocCenterIbp]		
			&$cmdList -List $list
			
			write-host "+ Liste [ $Delegate_Toolkit_ListName_DocCenterIbpBanques ]" -f white
			$list = $web.Lists[$Delegate_Toolkit_ListName_DocCenterIbpBanques]
			&$cmdList -List $list
				
			write-host "+ Liste [ $Delegate_Toolkit_ListName_DocCenterInternes ]" -f white
			$list = $web.Lists[$Delegate_Toolkit_ListName_DocCenterInternes]
			&$cmdList -List $list

		}
	}
	end
	{
		Stop-SPAssignment $localAssignment
	}
}

#
# Exécution d'un ensemble de traitements sur un Espace Co
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnEspaceCo
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_Projet `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur un Espace Co
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnEspaceCo_FromConfig
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[xml] $ConfigXmlDoc,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[int] $CoreIndex,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite_FromConfig `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_Projet `
			-ConfigXmlDoc $ConfigXmlDoc `
			-CoreIndex $CoreIndex `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur une biblio produit
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnBiblioProduit
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_BiblioProduit `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur une biblio produit
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnBiblioProduit_FromConfig
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[xml] $ConfigXmlDoc,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[int] $CoreIndex,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite_FromConfig `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_BiblioProduit `
			-ConfigXmlDoc $ConfigXmlDoc `
			-CoreIndex $CoreIndex `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur une biblio 2.0
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnBiblio2
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_Biblio2 `
			-cmd $cmd
	}
}


#
# Exécution d'un ensemble de traitements sur une biblio 2.0
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnBiblio2_FromConfig
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[xml] $ConfigXmlDoc,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[int] $CoreIndex,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	process
	{
		RunOnTemplatedSite_FromConfig `
			-WebTemplateName $Delegate_Toolkit_WebTemplate_Biblio2 `
			-ConfigXmlDoc $ConfigXmlDoc `
			-CoreIndex $CoreIndex `
			-cmd $cmd
	}
}

#
# Exécution d'un ensemble de traitements sur un site sur la base du template du RootWeb
# REMARQUE : Le délégué appelé doit prendre un paramètre de type SPSite nommé Site
#
function RunOnTemplatedSite
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[string] $WebTemplateName,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	begin
	{
		$localAssignment = Start-SPAssignment
		$allSites = $localAssignment | Get-SPSite -Limit All | ?{$_.RootWeb.WebTemplate -like $webTemplateName}
	}
	process
	{
		foreach($site in $allSites)
		{
			&$cmd -Site $site
		}
	}
	end
	{
		Stop-SPAssignment $localAssignment
	}
}

function RunOnTemplatedSite_FromConfig
{
	param
	(
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[string] $WebTemplateName,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[xml] $ConfigXmlDoc,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[int] $CoreIndex,
		[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
		[ScriptBlock] $cmd
	)
	begin
	{
		$localAssignment = Start-SPAssignment
		$localServerName =  [Microsoft.SharePoint.Administration.SPServer]::Local.Name
		$lowerWebTemplate = $WebTemplateName.ToLower()
		
		# Pour tous les Sites qui satisfont le Template de site dans la ferme
		$allSitesInfos = $ConfigXmlDoc.SelectNodes("//DocCenter[(@InChargeServerName='$localServerName') and (@InChargeCore='$CoreIndex')]/descendant-or-self::*[@WebTemplate='$lowerWebTemplate']")
		#$localAssignment | Get-SPSite -Limit All | ?{$_.RootWeb.WebTemplate -like $webTemplateName}
	}
	process
	{
		foreach($siteInfo in $allSitesInfos)
		{
			$site = $localAssignment | Get-SPSite $siteInfo.Url
			&$cmd -Site $site
		}
	}
	end
	{
		Stop-SPAssignment $localAssignment
	}
}
